/*

This file is part of Rooms3D.

Copyright (C) 2008 Pixecur Technologies Incorporated (Esotera).
Visit Esotera at http://www.esoteras3.com
 
Rooms3D is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3, or (at your option)
any later version.
 
Rooms3D is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with Rooms3D; see the file COPYING.  If not, write to 
Pixecur Technologies, 213-31 Peet Street, St. John's, NL, A1B 3W8. 
 
Linking this library statically or dynamically with other modules is
making a combined work based on this library.  Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
 
*/

package com.datasentinel.rooms.j3d.util;

import java.util.Enumeration;
import java.util.Iterator;

import javax.media.j3d.Group;
import javax.media.j3d.Node;

import com.datasentinel.util.TreeTraversalSupport;

/**
 * @author rickp
 * 
 */
public class SceneGraphTraversalSupport implements TreeTraversalSupport
{
	@Override
	public Iterable<?> getIterable(Object node)
	{
		Iterable<?> ans = null;
		if (node instanceof Group)
		{
			final Group group = (Group)node;
			return new Iterable<Node>()
			{
				public Iterator<Node> iterator()
				{
					return new NodeIterator(group);
				}
			};
		}
		return ans;
	}

	@Override
	public boolean isLeaf(Object node)
	{
		return !(node instanceof Group);
	}

	private static class NodeIterator implements Iterator<Node>
	{
		private Enumeration<?> e;

		public NodeIterator(Group group)
		{
			e = group.getAllChildren();
		}

		public Node next()
		{
			Node ans = null;
			Object next = e.nextElement();
			if (next instanceof Node)
			{
				ans = (Node)next;
			}
			return ans;
		}

		public boolean hasNext()
		{
			return e.hasMoreElements();
		}

		public void remove()
		{
			throw new UnsupportedOperationException();
		}
	}
}
